package com.dhcc.DRGsHosp.web.controller;

import com.dhcc.DRGsHosp.facade.HospConfigFacade;
import com.dhcc.DRGsHosp.facade.InitializeFacade;
import com.dhcc.DRGsHosp.facade.SumExpenseFacade;
import com.dhcc.DRGsHosp.facade.SystemConfigFacade;
import com.dhcc.DRGsHosp.infra.util.GlobalData;
import com.dhcc.DRGsHosp.infra.util.StringUtils;
import org.codehaus.jackson.map.ObjectMapper;
import org.openkoala.koala.commons.InvokeResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.InputStream;
import java.util.*;

/**
 * @title		:SystemConfigController.java
 * @description	:对drgs.T_CONFIG增删改查Controller层
 * @author		:gehui
 * @date		:2016年11月30日
 * @version     :1.0
 * @copyright   :DHCC 2013-2014 
 */
@Controller("drgsHospWebController41")
@RequestMapping(value="systemConfig")
public class SystemConfigController {
	@Autowired
	SystemConfigFacade systemConfigFacade;
	@Autowired
	private HospConfigFacade hospConfigFacade;
	@Autowired
	private SumExpenseFacade sumExpenseFacade;
	
	@Autowired
	private InitializeFacade initializeFacade;

	//全表查询配置表T_CONFIG
	@ResponseBody
	@RequestMapping("/configSearch")
	public InvokeResult systemConfig(){
		InvokeResult result=systemConfigFacade.systemConfig();
		return result;
	}
	
	/**
	 * 
	 *  t_configcfg_codeSearch.  
	 *  @Description：获取基金类型
	 *  @Author LiuHongjun
	 *  @param alterParam
	 *  @return 
	 *  @Date:2017年6月19日下午8:10:36
	 */
	@ResponseBody
	@RequestMapping("/getConfigByCode")
	public InvokeResult getConfigByCode(String alterParam){
		return InvokeResult.success(GlobalData.sysConfig.get(alterParam));
	}
	
	//按字典项代码查询字典表MR_DICTIONARYDATA
	@ResponseBody
	@RequestMapping("/dicCodeSearch")
	public InvokeResult dicSearch(String param){
		InvokeResult result=systemConfigFacade.dicSearch(param);
		return result;
	}
	
	//添加/更新配置项
	@ResponseBody
	@RequestMapping("/addCfg")
	public InvokeResult saveCfg(String param){
		ObjectMapper objectMapper = new ObjectMapper();
		Map<String, Object> json;
		try {
			json = objectMapper.readValue(param, Map.class);
		} catch (Exception e) {
			e.printStackTrace();
			json = new HashMap<String, Object>();
		} 
		return systemConfigFacade.saveCfg(json);
	}
	
	//删除配置项
	@ResponseBody
	@RequestMapping("/delCfg")
	public InvokeResult delCfg(String param){
		return systemConfigFacade.delCfg(param);
	}
	/**
	 * 
	 *  getDictionaryValue.  
	 *  @Description：获取字典的映射值
	 *  @Author LiuHongjun
	 *  @param dicCodes
	 *  @return 
	 *  @Date:2017年7月15日上午9:13:37
	 */
	@ResponseBody
	@RequestMapping("/findDictionary")
	public InvokeResult findDictionary(){
		return InvokeResult.success(GlobalData.sysDictionary);
	}
	/**
	 * 
	 * @methodname    :saveSystemConfig
	 * @description   : 保存系统配置信息
	 * @param         :
	 * @author        :mazhaoyan
	 * @return        :
	 * @date          :2016年12月29日
	 */
	@ResponseBody
	@RequestMapping("/saveSystemConfig")
	public InvokeResult saveSystemConfig(String configs){
		ObjectMapper objectMapper = new ObjectMapper();
		List<Map<String, Object>> json;
		try {
			json = objectMapper.readValue(configs, List.class);
		} catch (Exception e) {
			e.printStackTrace();
			json = new ArrayList<Map<String, Object>>();
		}
		InvokeResult result = InvokeResult.success();
		for(int i = 0;i<json.size();i++){
			Map<String, Object> tMap = new HashMap<String, Object>();
			tMap = json.get(i);
			String cfg_code = tMap.get("cfg_code").toString();
			if ("COST_SUB".equals(cfg_code)) {
				int exceptionNum = hospConfigFacade.saveCostSubInfo(tMap.get("cfg_value").toString());
				if(exceptionNum==-1){
					result = InvokeResult.failure("保存费用子项失败");
				}else {
					result = InvokeResult.success();
				}
			}else{
				result = systemConfigFacade.saveCfg(tMap);
			}
			if(result.isHasErrors()){
				break;
			}
		}
		//更新系统配置全局变量
		initializeFacade.initializeSysConfig();
		return result;
	}
	/**
	 * 
	 * @methodname    :getConfigValue
	 * @description   : 获取已配置的数据值
	 * @param         :
	 * @author        :mazhaoyan
	 * @return        :
	 * @date          :2016年12月29日
	 */
	@ResponseBody
	@RequestMapping("/getConfigValue")
	public InvokeResult getConfigValue(){
		Map<Object,Object> configMap = new HashMap<Object,Object>();
		configMap = systemConfigFacade.getConfigValue();
		Map<String,Object> costMap = new HashMap<String,Object>();
		costMap = hospConfigFacade.loadCostSubInfo();
		configMap.put("COST_INFO",costMap);
		return InvokeResult.success(configMap);
	}
	
	/**
	 * 
	 *  findTableFiles.  
	 *  @Description：获取字段和描述
	 *  @Author LiuHongjun
	 *  @param tableName
	 *  @return 
	 *  @Date:2017年4月28日上午11:48:56
	 */
	@ResponseBody
	@RequestMapping("/findTableFiles")
	public InvokeResult findTableFiles(String tableName){
		return systemConfigFacade.findTableFiles(tableName);
	}
	/**
	 * 
	 *  getMaxGroupYear.  
	 *  @Description：获取系统最大分组年份
	 *  @Author LiuHongjun
	 *  @param tableName
	 *  @return 
	 *  @Date:2017年5月27日上午9:27:33
	 */
	@ResponseBody
	@RequestMapping("/getMaxGroupYear")
	public InvokeResult getMaxGroupYear(){
		return InvokeResult.success(systemConfigFacade.getMaxGroupYear());
	}
	
	/**
	 * Description：获取可配置的医院指标
	 * date: 2017年7月10日 下午5:04:56  
	 * @author ShaozhiYuan
	 * @version V1.0 DHC
	 */
	@ResponseBody
	@RequestMapping("/getHospQuota")
	public InvokeResult getHospQuota(){
		return systemConfigFacade.getHospQuota();
	}
	/**
	 * Description：更改可配置的医院指标
	 * date: 2017年7月10日 下午5:04:56  
	 * @author ShaozhiYuan
	 * @version V1.0 DHC
	 */
	@ResponseBody
	@RequestMapping("/updateHospQuota")
	public InvokeResult updateHospQuota(String dataHospQuote,String flag){
		systemConfigFacade.updateHospQuota(dataHospQuote,flag);
		return InvokeResult.success();
	}
	/**
	 *  getStdYear.  
	 *  @Description：获取年度标杆
	 *  @Author LiuHongjun
	 *  @return 
	 *  @Date:2017年8月9日上午10:21:01
	 */
	@ResponseBody
	@RequestMapping("/getStdYear")
	public InvokeResult getStdYear(){
		return InvokeResult.success(systemConfigFacade.getStdYear());
	}
	
	/**
	 *  getStdInfo.  
	 *  @Description：获取标杆信息
	 *  @Author fulianxia
	 *  @return 
	 *  @Date:2018年1月17日
	 */
	@ResponseBody
	@RequestMapping("/getStdInfo")
	public InvokeResult getStdInfo(){
		return InvokeResult.success(systemConfigFacade.getStdInfo());
	}
	/**
	 *  @Discription：获取在线分组版本号
	 *  @Author： liuhongjun
	 *  @return
	 *  @Date:2018年8月28日下午3:51:14
	 */
	@ResponseBody
	@RequestMapping("/getOnlineGroup")
	public InvokeResult getOnlineGroup(){
		return InvokeResult.success(systemConfigFacade.getOnlineGroup());
	}
	/**
	 * 
	 *  getStdAvgFee.  
	 *  @Description：获取调整后的次均费用
	 *  @Author LiuHongjun
	 *  @return 
	 *  @Date:2017年8月9日上午11:18:06
	 */
	@ResponseBody
	@RequestMapping("/getStdAvgFee")
	public InvokeResult getStdAvgFee(String stdId,String adjust){
		return InvokeResult.success(systemConfigFacade.getStdAvgFee(stdId,adjust));
	}
	/**
	 * 
	 *  saveAvgFeeAdjust.  
	 *  @Description：更新调整后的次均费用
	 *  @Author LiuHongjun
	 *  @param stdYear
	 *  @param adjust
	 *  @return 
	 *  @Date:2017年8月9日下午4:08:21
	 */
	@ResponseBody
	@RequestMapping("/saveAvgFeeAdjust")
	public InvokeResult saveAvgFeeAdjust(String stdId,String adjust){
		return InvokeResult.success(systemConfigFacade.saveAvgFeeAdjust(stdId,adjust));
	}
	
	/**
	 * 
	 *  getOrderDep.  
	 *  @Description：获取医嘱开单科室
	 *  @Author WENYI
	 *  @return 
	 *  @Date:2017年8月10日上午9:20:12
	 */
	@ResponseBody
	@RequestMapping("/getOrderDep")
	public InvokeResult getOrderDep(){
		return InvokeResult.success(systemConfigFacade.getOrderDep());
	}
	
	/**
	 * 
	 *  saveSpecialDep.  
	 *  @Description：保存特殊部门配置
	 *  @Author WENYI
	 *  @return 
	 *  @Date:2017年8月10日上午9:20:29
	 */
	@ResponseBody
	@RequestMapping("/saveSpecialDep")
	public InvokeResult saveSpecialDep(String deps){
		return InvokeResult.success(systemConfigFacade.saveSpecialDep(deps));
	}
	
	/**
	 * 
	 *  getAvgFeeConfig.  
	 *  @Description：获取次均费用调整参数
	 *  @Author LiuHongjun
	 *  @return 
	 *  @Date:2017年8月9日下午3:23:11
	 */
	@ResponseBody
	@RequestMapping("/getAvgFeeConfig")
	public InvokeResult getAvgFeeConfig(){
		return InvokeResult.success(systemConfigFacade.getAvgFeeConfig());
	}
	/**
	 * 
	 *  getDoctorConfig.  
	 *  @Description：获取医师显示情况
	 *  @Author LiuHongjun
	 *  @return 
	 *  @Date:2017年9月7日上午8:59:54
	 */
	@ResponseBody
	@RequestMapping("/getDoctorConfig")
	public InvokeResult getDoctorConfig(){	    
		return InvokeResult.success(systemConfigFacade.getDoctorConfig());
	}
	/**
	 * 
	 *  sumExpenseFacade.  
	 *  @Description：触发费用计算
	 *  @Author LiuHongjun
	 *  @param dateFrom
	 *  @param dateTo
	 *  @return 
	 *  @Date:2017年9月20日上午11:25:17
	 */
	@ResponseBody
	@RequestMapping("/sumExpense")
	public InvokeResult sumExpense(String dateFrom,String dateTo,String dateType){	    
		sumExpenseFacade.sumExpense(dateFrom, dateTo,dateType);
		return InvokeResult.success();
	}
	/**
	 * 
	 *  getMedisType.  
	 *  @Description：获取数据库中医保类型编码
	 *  @Author LiuHongjun
	 *  @return 
	 *  @Date:2017年10月20日下午3:51:37
	 */
	@ResponseBody
	@RequestMapping("/getMedisType")
	public InvokeResult getMedisType(){	    
		return InvokeResult.success(systemConfigFacade.getMedisType());
	}
	/**
	 *  handelSpecCode.  
	 *  @Description：特殊字符处理
	 *  @Author LiuHongjun
	 *  @param dateF
	 *  @param dateT
	 *  @param specCode
	 *  @return 
	 *  @Date:2017年11月30日下午4:05:19
	 */
	@ResponseBody
	@RequestMapping("/handelSpecCode")
	public InvokeResult handelSpecCode(){	    
		return InvokeResult.success(sumExpenseFacade.handelSpecCode());
	}
	/**
	 *  @desp  ： 保存用户分组方案
	 *  @Author： lhj
	 *  @param userId
	 *  @param roleId
	 *  @param groupScheme
	 *  @return
	 *  @Date  :2018年2月24日下午8:28:17
	 */
	@ResponseBody
	@RequestMapping("/setSystemGroupScheme")
	public InvokeResult setSystemGroupScheme(String userId,String roleId,String groupScheme){	
		try{
			systemConfigFacade.setSystemGroupScheme(userId,StringUtils.stringToAscii(roleId).replaceAll(",", ""),groupScheme);
			return InvokeResult.success();
		}catch(Exception e){
			return InvokeResult.failure(e.getMessage());
		}
	}
	/**
	 *  @desp  ：获取用户配置好的分组方案
	 *  @Author： lhj
	 *  @param userId
	 *  @param roleId
	 *  @return
	 *  @Date  :2018年2月25日上午9:33:46
	 */
	@ResponseBody
	@RequestMapping("/getSystemGroupScheme")
	public InvokeResult getSystemGroupScheme(){	
		try{
			String groupScheme=systemConfigFacade.getSystemGroupScheme();
			return InvokeResult.success(groupScheme);
		}catch(Exception e){
			return InvokeResult.failure(e.getMessage());
		}
	}
	/**
	 *  @desp  ：获取当前数据含有的分组方案
	 *  @Author： liuhongjun
	 *  @return
	 *  @Date  :2018年3月10日上午10:28:47
	 */
	@ResponseBody
	@RequestMapping("/getMrGroupScheme")
	public InvokeResult getMrGroupScheme(){	
		try{
			List<Map<String,Object>> list=systemConfigFacade.getMrGroupScheme();
			return InvokeResult.success(list);
		}catch(Exception e){
			return InvokeResult.failure(e.getMessage());
		}
	}
	/**
	 *  @Discription：获取分组器和标杆映射关系
	 *  @Author： liuhongjun
	 *  @return
	 *  @Date:2018年4月18日下午1:34:01
	 */
	@ResponseBody
	@RequestMapping("/getGroupMatchStd")
	public InvokeResult getGroupMatchStd(){	
		try{
			Map<String,Object> map=systemConfigFacade.getGroupMatchStd();
			return InvokeResult.success(map);
		}catch(Exception e){
			return InvokeResult.failure(e.getMessage());
		}
	}
	/**
	 *  @Discription：根据分组方案获取当前分组器版本
	 *  @Author： liuhongjun
	 *  @return
	 *  @Date:2018年4月18日下午8:34:08
	 */
	@ResponseBody
	@RequestMapping("/getGroupByScheme")
	public InvokeResult getGroupByScheme(String groupScheme){	
		try{
			String groupVer=systemConfigFacade.getGroupByScheme(groupScheme);
			return InvokeResult.success(groupVer);
		}catch(Exception e){
			return InvokeResult.failure(e.getMessage());
		}
	}
	/**
	 *  @Discription：获取es服务配置
	 *  @Author： liuhongjun
	 *  @return
	 *  @Date:2018年5月25日下午5:31:10
	 */
	@ResponseBody
	@RequestMapping("/getEsClientConfig")
	public InvokeResult getEsClientConfig(){
		Map<String, String> map=new HashMap<>();
		try {
			InputStream propInputStream = SystemConfigController.class.getResourceAsStream("/ES.cfg.properties");
			Properties properties = new Properties();
			properties.load(propInputStream);
			String esClusterName = properties.getProperty("esClusterName");
			String esServerIps = properties.getProperty("esServerIps");
			String esServerPort = properties.getProperty("esServerPort");
			map.put("esClusterName", esClusterName);
			map.put("esServerIps", esServerIps);
			map.put("esServerPort", esServerPort);
		}catch(Exception e) {
			e.printStackTrace();
			return InvokeResult.failure(e.getMessage());
		}
	    return InvokeResult.success(map);
	}
	
	@ResponseBody
	@RequestMapping("/syncDepartment")
	public InvokeResult syncDepartment(String depInfo){
		return systemConfigFacade.syncDepartment(depInfo);
	}
}
